home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 1.iso / toolbox / src / demos / OpenGL / space / menu.c < prev    next >
C/C++ Source or Header  |  1996-11-11  |  10KB  |  326 lines

  1. /*
  2.  * Copyright (C) 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. #include "space.h"
  18.  
  19. #define  MENUCOUNT       17
  20. #define  XSCALE          ((float)(Counter.winsizex/1024.0))
  21. #define  YSCALE          ((float)(Counter.winsizey/1024.0))
  22.  
  23. static t_menu menu[MENUCOUNT] = {
  24.    {  10,     16, 100,192/2-8,SP_IO_o  ,PRBIT_FLAG,0xc0c0c0c0,"o"       ,"Planet" ,"Orbit"    },
  25.    {  10,192/2+8, 100,192-16 ,SP_IO_i  ,MRBIT_FLAG,0xc0c0c0c0,"i"       ,"Moon"   ,"Orbit"    },
  26.    { 110,     16, 200,192/2-8,SP_IO_n  ,STNAM_FLAG,0xc0c0c0c0,"n"       ,"Star"   ,"Names"    },
  27.    { 110,192/2+8, 200,192-16 ,SP_IO_x  ,NOTXT_FLAG,0xc0c0c0c0,"x"       ,"No"     ,"Text"     },
  28.    { 210,     16, 300,192/2-8,SP_IO_l  ,SHADE_FLAG,0xc0c0c0c0,"l"       ,"Always" ,"Shade"    },
  29.    { 210,192/2+8, 300,192-16 ,SP_IO_v  ,VELOC_FLAG,0xc0c0c0c0,"v"       ,"Reverse","Velocity" },
  30.    { 310,     16, 400,192/2-8,SP_IO_q  ,PANEL_FLAG,0xc0c0c0c0,"q"       ,"Panel"  ,"On/Off"   },
  31.    { 310,192/2+8, 400,192-16 ,SP_IO_h  ,HELPP_FLAG,0xc0c0c0c0,"h"       ,"Help"   ,""         },
  32.    { 410,     16, 500,192/2-8,SP_IO_tid,TMREV_FLAG,0xc0c0c0c0,"-"       ,"Time"   ,"Reverse"  },
  33.    { 410,192/2+8, 500,192-16 ,SP_IO_y  ,         0,0xc0c0c0c0,"y"       ,"Time"   ,"Reset"    },
  34.    { 510,     48, 900,192/2-8,SP_IO_tco,         0,0xc0c0c0c0,"r,t"     ,"Time"   ,"Control"  },
  35.    { 510,192/2+8, 600,192-16 ,SP_IO_a  ,AUTOP_FLAG,0xc0c0c0c0,"a"       ,"Auto"   ,"Pilot"    },
  36.    { 610,192/2+8, 700,192-16 ,SP_IO_s  ,STATS_FLAG,0xc0c0c0c0,"s"       ,"Stats"  ,""         },
  37.    { 710,192/2+8, 800,192-16 ,SP_IO_z  ,ZODAC_FLAG,0xc0c0c0c0,"z"       ,"Zodiac" ,""         },
  38.    { 810,192/2+8, 900,192-16 ,SP_IO_b  ,HIRES_FLAG,0xc0c0c0c0,"b"       ,"Hi-Res" ,""         },
  39.    { 910,     16,1000,192/2-8,SP_IO_esc,         0,0xc0c0c0c0,"Esc"     ,"Quit"   ,""         },
  40.    { 910,192/2+8,1000,192-16 ,SP_IO_pri,PRINT_FLAG,0xc0c0c0c0,"PrntScrn","Image"  ,"Snap/Quit"}
  41. } ;
  42.  
  43. extern long control_height;
  44. extern t_stopwatch Counter ;
  45.  
  46. /**********************************************************************
  47. *  draw_menu()  - 
  48. ***********************************************************************/
  49. void draw_menu()
  50.  
  51. {  t_menu *m ;
  52.    sint32 i,save ;
  53.  
  54. #ifdef SOUND
  55.    save = 0 ;
  56.    if ((Counter.alpha & HW_SOUND) && (Counter.flags & SOUND_FLAG))  {
  57.      Counter.flags &= ~SOUND_FLAG ;
  58.      save = 1 ;
  59.      }
  60. #endif
  61.  
  62.    if (Counter.flags & PANEL_FLAG)  {
  63.      glEnable(GL_SCISSOR_TEST) ;
  64.      glScissor(0,0,Counter.winsizex,control_height) ;
  65.      glViewport(0,0,Counter.winsizex,control_height) ;
  66.  
  67.      glDrawBuffer(GL_FRONT_AND_BACK);
  68.      glClearColor(0.0,0.125,0.0,0.0) ;
  69.      glClear(GL_COLOR_BUFFER_BIT) ;
  70.      glDrawBuffer(GL_BACK);
  71.  
  72.      for (m=menu,i=0; i<MENUCOUNT; m++,i++) 
  73.        draw_item(m->butt,m) ;
  74.  
  75.      glScissor(0,control_height,Counter.winsizex,Counter.winsizey-control_height) ;
  76.      glViewport(0,control_height,Counter.winsizex,Counter.winsizey-control_height) ;
  77.      }
  78.    else  {
  79.      glScissor(0,0,Counter.winsizex,Counter.winsizey) ;
  80.      glViewport(0,0,Counter.winsizex,Counter.winsizey) ;
  81.      glDisable(GL_SCISSOR_TEST) ;
  82.      }
  83.  
  84. #ifdef SOUND
  85.    if (save)
  86.      Counter.flags |= SOUND_FLAG ;
  87. #endif
  88. }
  89.  
  90. /**********************************************************************
  91. *  check_menu()  - 
  92. ***********************************************************************/
  93. void check_menu(t_boss *flaggs)
  94.  
  95. {  t_menu *m;
  96.    sint32 x,y,i ;
  97.  
  98.    x = (Counter.mouse_x - Counter.winorigx)/XSCALE;
  99.    y = (Counter.mouse_y - Counter.winorigy)/YSCALE;
  100.  
  101.    for (m=menu,i=0; i<MENUCOUNT; m++,i++)
  102.      if (x >= m->x1 && x <= m->x2 && y >= m->y1 && y <= m->y2) {
  103.        key_press(flaggs,m->butt);
  104.        return;
  105.        }
  106. }
  107.  
  108. /**********************************************************************
  109. *  draw_item()  - 
  110. ***********************************************************************/
  111. void draw_item(sint32 but,t_menu *m)
  112.  
  113. {  flot32 v[2],xx,yy ;
  114.    sint32 i,j ;
  115.    schar8 ch[32] ;
  116.    uchar8 cl[4] ;
  117.    uint32 col;
  118.  
  119.    if (m == 0)
  120.      for (i=0; i<MENUCOUNT; i++)
  121.        if (menu[i].butt == but) {
  122.          m = &menu[i] ;
  123.          break ;
  124.          }
  125.    if (m == 0)
  126.      return ;
  127.  
  128.    glScissor(0,0,Counter.winsizex,control_height) ;
  129.    glViewport(0,0,Counter.winsizex,control_height) ;
  130.  
  131.    glMatrixMode(GL_PROJECTION);
  132.    glLoadIdentity();
  133.    glOrtho(0.0,1024.0,0.0,192.0,-1.0,1.0);
  134.    glMatrixMode(GL_MODELVIEW);
  135.    glLoadIdentity();
  136.  
  137.    glDrawBuffer(GL_FRONT_AND_BACK);
  138.  
  139.    col = (Counter.flags & m->mask) ? m->col : 0x40404040 ;
  140.    cl[0] = (col >>  0) & 0xff;
  141.    cl[1] = (col >>  8) & 0xff;
  142.    cl[2] = (col >> 16) & 0xff;
  143.    glColor3ubv(cl);
  144.    glRecti(m->x1-1,m->y1-1,m->x2+1,m->y2+1) ;
  145.  
  146.    glColor3f(0.0,0.0,0.0);
  147.    glBegin(GL_LINE_STRIP);
  148.    glVertex2i(m->x1-1,m->y1-1);
  149.    glVertex2i(m->x2+1,m->y1-1);
  150.    glVertex2i(m->x2+1,m->y2+1);
  151.    glVertex2i(m->x1-1,m->y2+1);
  152.    glVertex2i(m->x1-1,m->y1-1);
  153.    glEnd();
  154.  
  155.    if (m->butt == SP_IO_tco)  {
  156.      glColor4f(0.0,0.0,0.0,0.0);
  157.  
  158.      for (yy= -3.0; yy<10.5; yy+=1.0)  {
  159.        i = m->x1 + 20.0*yy + 76.0 ;
  160.  
  161.        glColor4ubv((unsigned char *)&m->col) ;
  162.        if (yy == -3.0)
  163.          spDrawString(i-16,m->y1-16,0.0,"Stop") ;
  164.        else  {
  165.          sprintf(ch,"%1.0f",yy) ;
  166.          spDrawString(i,m->y1-16,0.0,ch) ;
  167.          }
  168.        }
  169.  
  170.      i = (Counter.mouse_x - Counter.winorigx)/XSCALE;
  171.      j = (Counter.mouse_y - Counter.winorigy)/YSCALE;
  172.  
  173.      if (i >= m->x1 && i <= m->x2 && j >= m->y1 && j <= m->y2)  {
  174.        yy = (i - m->x1 - 76.0) / 20.0 ;
  175.  
  176.        if (yy < -3.0)  {
  177.          yy = -3.0 ;
  178.          Counter.timacc = 0.0 ;
  179.          }
  180.        else if (yy > 10.0)  {
  181.          yy = 10.0 ;
  182.          Counter.timacc = fexp(yy*flog(10.0)) ;
  183.          }
  184.        else Counter.timacc = fexp(yy*flog(10.0)) ;
  185.  
  186.        i = m->x1 + 20.0*yy + 76.0 ;
  187.        }
  188.      else  {
  189.        xx = Counter.timacc ;
  190.  
  191.        if (xx == 0.0)
  192.          yy = -3.0 ;
  193.        else yy = flog10(xx) ;
  194.  
  195.        i = m->x1 + 20.0*yy + 76.0 ;
  196.        }
  197.  
  198.      glScissor(m->x1*XSCALE,m->y1*YSCALE,(m->x2-m->x1)*XSCALE,(m->y2-m->y1)*YSCALE);
  199.  
  200.      glColor3f(1.0,1.0,1.0);
  201.      glBegin(GL_LINES) ;
  202.      v[0] = i ; v[1] = m->y1+1 ; glVertex2fv(v) ;
  203.      v[0] = i ; v[1] = m->y2-2 ; glVertex2fv(v) ;
  204.      glEnd() ;
  205.  
  206.      cl[0] = (m->col >>  0) & 0xff;
  207.      cl[1] = (m->col >>  8) & 0xff;
  208.      cl[2] = (m->col >> 16) & 0xff;
  209.      glColor3ubv(cl);
  210.  
  211.      spDrawString(m->x2-64,m->y2-36,0.0,m->mes0) ;
  212.      spDrawString(m->x2-64,m->y2-12,0.0,m->mes1) ;
  213.      spDrawString(m->x2-64,m->y2-24,0.0,m->mes2) ;
  214.      }
  215.    else  {
  216.      glScissor(m->x1*XSCALE,m->y1*YSCALE,(m->x2-m->x1)*XSCALE,(m->y2-m->y1)*YSCALE);
  217.  
  218.      col = (Counter.flags & m->mask) ? 0x0 : m->col ;
  219.      cl[0] = (col >>  0) & 0xff;
  220.      cl[1] = (col >>  8) & 0xff;
  221.      cl[2] = (col >> 16) & 0xff;
  222.      glColor3ubv(cl);
  223.  
  224.      spDrawString(m->x1+8,m->y1+4,0.0,m->mes0) ;
  225.      spDrawString(m->x1+8,((m->y1+m->y2)>>1)+16,0.0,m->mes1) ;
  226.      spDrawString(m->x1+8,((m->y1+m->y2)>>1)-8,0.0,m->mes2) ;
  227.      }
  228.  
  229.    glDrawBuffer(GL_BACK);
  230.  
  231.    glScissor(0,control_height,Counter.winsizex,Counter.winsizey-control_height) ;
  232.    glViewport(0,control_height,Counter.winsizex,Counter.winsizey-control_height) ;
  233.  
  234. #ifdef SOUND
  235.    if ((Counter.alpha & HW_SOUND) && (Counter.flags & SOUND_FLAG))  {
  236.      if (m->mask & AUTOP_FLAG)  {
  237.        if (Counter.flags & AUTOP_FLAG)
  238.          sound_control(1,SND_AUON) ;
  239.        else sound_control(1,SND_AUOF) ;
  240.        }
  241.      else sound_control(1,SND_BUTT) ;
  242.      }
  243. #endif
  244. }
  245.  
  246. /**********************************************************************
  247. *  draw2_menu()  - 
  248. ***********************************************************************/
  249. void draw2_menu(sint32 count,t_menu *mn)
  250.  
  251. {  sint32 i;
  252.    uchar8 cl[4];
  253.  
  254.    glDrawBuffer(GL_FRONT);
  255.  
  256.    glMatrixMode(GL_PROJECTION);
  257.    glLoadIdentity();
  258.    glOrtho(0.0,1280.0,0.0,832.0,-1.0,1.0);
  259.    glMatrixMode(GL_MODELVIEW);
  260.    glLoadIdentity();
  261.  
  262.    for (i=0; i<count; mn++,i++)  {
  263.      cl[0] = (mn->col >>  0) & 0xff;
  264.      cl[1] = (mn->col >>  8) & 0xff;
  265.      cl[2] = (mn->col >> 16) & 0xff;
  266.      glColor3ubv(cl);
  267.      glRecti(mn->x1-1,mn->y1-1,mn->x2+1,mn->y2+1) ;
  268.  
  269.      glColor4f(0.0,0.0,0.0,0.0);
  270.      glBegin(GL_LINES);
  271.      glVertex2i(mn->x1-1,mn->y1-1);
  272.      glVertex2i(mn->x2+1,mn->y1-1);
  273.      glVertex2i(mn->x2+1,mn->y2+1);
  274.      glVertex2i(mn->x1-1,mn->y2+1);
  275.      glVertex2i(mn->x1-1,mn->y1-1);
  276.      glEnd();
  277.  
  278.      spDrawString(mn->x1+4,mn->y1+4,0.0,mn->mes0) ;
  279.      }
  280.  
  281.    glDrawBuffer(GL_BACK);
  282. }
  283.  
  284. /**********************************************************************
  285. *  check2_menu()  - 
  286. **********************************************************************/
  287. sint32 check2_menu(sint32 count,t_menu *mn)
  288.  
  289. {  sint32 i,x,y;
  290.    t_menu *m ;
  291.  
  292.    while (1)  {
  293.      spWaitForLeftButton();
  294.  
  295.      if (Counter.flags & PANEL_FLAG)  {
  296.        x = (Counter.mouse_x - Counter.winorigx                 )*1280/Counter.winsizex;
  297.        y = (Counter.mouse_y - Counter.winorigy - control_height)* 832/(Counter.winsizey-control_height);
  298.        }
  299.      else  {
  300.        x = (Counter.mouse_x - Counter.winorigx)*1280/Counter.winsizex;
  301.        y = (Counter.mouse_y - Counter.winorigy)* 832/Counter.winsizey;
  302.        }
  303.  
  304.      for (m=mn,i=0; i<count; m++,i++) 
  305.        if (x >= m->x1 && x <= m->x2 && y >= m->y1 && y <= m->y2)
  306.          return(i) ;
  307.      }
  308. }
  309.  
  310. /**********************************************************************
  311. *  make_new_item()  - 
  312. **********************************************************************/
  313. void make_new_item(t_menu *m,sint32 i,uint32 col,char *ch)
  314.  
  315. {  
  316.     m->x1   = (Counter.rotsizex>>1) - 116 ;
  317.     m->y1   = 684 - 20*i ;
  318.     m->x2   = m->x1 + 232 ;
  319.     m->y2   = m->y1 + 16 ;
  320.     m->butt = 0 ;
  321.     m->mask = 0 ;
  322.     m->col  = col ;
  323.     strcpy(m->mes0,ch) ;
  324. }
  325.  
  326.